#!/usr/bin/env python
# -*- coding: utf-8 -*-

from abc import ABC, abstractmethod
from typing import Dict, List, Any, Optional


class BaseCrawler(ABC):
    """
    爬虫基类，定义爬虫的基本接口
    只包含核心抽象方法，其他所有逻辑都在子类中实现
    """
    
    def __init__(self):
        """初始化爬虫，子类可重写"""
        pass
    
    @abstractmethod
    def crawl(self, url: str) -> Optional['ArticleData']:
        """
        爬取单篇文章
        :param url: 文章URL
        :return: 文章数据对象，失败返回None
        """
        pass
    
    @abstractmethod
    def get_article_urls(self, base_url: str, **kwargs) -> List[str]:
        """
        获取文章URL列表
        :param base_url: 基础URL
        :param kwargs: 其他参数
        :return: 文章URL列表
        """
        pass